home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / knowhow4 / mouse2.cpp < prev    next >
Text File  |  1994-10-10  |  4KB  |  171 lines

  1. #include  <conio.h>
  2. #include "mouse.h"
  3. #include "mouse2.h"
  4. #include "ptimer.h"
  5.  
  6. class mousetimed : mouseeventlow
  7.   {
  8.     long time;
  9.      mousetimed(mouseeventlow& me):
  10.        mouseeventlow(me),time(programtime())
  11.      {  }
  12.  
  13.      operator int() const {return time!=0;}
  14.      int same_position(const mousetimed& other) const;
  15.     friend class pressreleasehistory;
  16.     friend loc mouseClearDoubleClick();
  17.      public:
  18.       mousetimed(int):time(0){}
  19.       mousetimed():time(0){}
  20.   //    void show(int line) const;
  21.   };
  22.  
  23.   int mousetimed::same_position(const mousetimed& other) const
  24.     {
  25.        return x==other.x && y==other.y;
  26.      }
  27.  
  28. /////////////////////////////////////////////////////////////////////////////
  29.  
  30. #define Type mousetimed
  31. #define HISSIZ 6
  32. class History_mousetimed
  33.     {
  34.       Type a[HISSIZ];
  35.       int present;
  36.       int written; // if <  HISSIZ
  37.       public:
  38.       History_mousetimed();
  39.       void record(const Type& x);
  40.       Type  recall(int n) const; // 0 - present, 1 - last but one, etc. to HISSIZ
  41.    //   void show(int first);
  42.  
  43.     };
  44.  
  45.  
  46.  
  47.    History_mousetimed::History_mousetimed():present(0),written(0)
  48.      {
  49.  
  50.      }
  51.  
  52.   void History_mousetimed::record(const Type& x)
  53.     {
  54.       if(! written)
  55.     {
  56.      a[0]=x;
  57.      present=0;written=1;
  58.      return;
  59.     }
  60.  
  61.       if(++present>=HISSIZ)present=0;
  62.       a[present]=x;
  63.      if(written <HISSIZ)written++;
  64.  
  65.     }
  66.  
  67.   Type  History_mousetimed::recall(int n) const
  68.     {
  69.        if (n>=written) return Type(0);
  70.        int ind=present-n;
  71.        if(ind<0) ind+=HISSIZ;
  72.        return a[ind];
  73.  
  74.     }
  75. #undef Type
  76. /////////////////////////////////////////////////////////////////////////////
  77.  
  78. class pressreleasehistory:mousehandler,History_mousetimed
  79.    {
  80.       long delta_t; // double_clicking speed
  81.       virtual void handle(mouseeventlow& ev);
  82.       int inhibit;
  83.       public:
  84.       pressreleasehistory(int dt=DEFAULTDOUBLECLICKSPEED);
  85.       int analyze() const;
  86.  
  87.       ~pressreleasehistory(){}
  88.  
  89.        friend void  mouseSetDoubleClick(int);
  90.        friend loc mouseClearDoubleClick();
  91.    };
  92.  
  93.      pressreleasehistory::pressreleasehistory(int dt) :
  94.     mousehandler(mouseeventlow::MSALL ^ mouseeventlow::MSMOVE),
  95.       delta_t(dt),inhibit(0)
  96.       { }
  97.    void pressreleasehistory::handle(mouseeventlow& ev)
  98.      {
  99.        record(ev);
  100.        inhibit=0;
  101.      }
  102.  
  103. #define ANYDOWN (mouseeventlow::MSLP | mouseeventlow::MSRP | mouseeventlow::MSCP)
  104.  int pressreleasehistory::analyze() const
  105.   // Analyze - for double-click pending
  106.    {
  107.     if (inhibit) return 0;
  108.     mousetimed e0=recall(0);
  109.     if(e0==0)return 0;
  110.     if(!(e0.evtype & ANYDOWN)) return 0;
  111.     int button=MOUSECENTER;
  112.     if(e0.evtype &mouseeventlow::MSLP) button=MOUSELEFT;
  113.     if(e0.evtype &mouseeventlow::MSRP) button=MOUSERIGHT;
  114.     mousetimed e1=recall(1),e2=recall(2);
  115.     int ok=(e1!=0) &&(e2!=0);
  116.     if(!ok) return 0;
  117.     ok=e0.same_position(e1) && e0.same_position(e2);
  118.     if(!ok) return 0;
  119.     ok= !(e1.buttonstatus & button) && (e2.buttonstatus & button);
  120.     if(! ok) return 0;
  121.     ok= ((e0.time-e1.time)<=delta_t) && ((e1.time-e2.time)<=delta_t);
  122.     return ok ? button<<8:0;
  123.  
  124.    }
  125. //
  126. //   MODULE STARTUP /CLEANUP
  127. // -------------------------------------------------
  128.  static pressreleasehistory * pr;
  129.   static void start_()
  130.   {
  131.      pr= new pressreleasehistory;
  132.    }
  133.   static void exit_()
  134.   {
  135.     delete pr;
  136.    }
  137. #pragma startup start_     80
  138. #pragma exit    exit_      80
  139.  
  140. // -------------------------------------------------
  141.  
  142.   mousestatus mouseGetStatus2()
  143.    {  mousestatus r;
  144.       r=mouseGetStatus();
  145.       r.buttonstate|=pr->analyze();
  146.       return r;
  147.     }
  148.  
  149. /*    void mousetimed::show(int line) const
  150.     {
  151.       gotoxy(40,line); clreol();
  152.      cprintf("T:%10ld ?:%5x B:%4x (%4d,%4d)",time,evtype,buttonstatus,x,y);
  153.  
  154.      } */
  155.  
  156.  
  157. void  mouseSetDoubleClick(int speed)
  158.   {
  159.     pr->delta_t=speed;
  160.   }
  161.  
  162.  loc mouseClearDoubleClick()
  163.    {
  164.     pr->inhibit=1;
  165.     mousetimed m=pr->recall(0);
  166.     return loc(m.x,m.y);
  167.     }
  168.  
  169. /*void debug()
  170.   {pr->show(1);} */
  171.